From d2b3b7424b1a35756e8cd2d49866eb1fa9dcab9b Mon Sep 17 00:00:00 2001 From: "emellor@leeni.uk.xensource.com" Date: Thu, 8 Dec 2005 16:17:53 +0000 Subject: [PATCH] Detach Xend from terminal, courtesy of Horms . * For setsid to effectively detach a process from the terminal, the following needs to occur: fork () Return control to the shell setsid () New session with no controlling terminal fork () The session leader (parent) exits and thus the resulting child process can never regain the terminal This patch adds the second fork * The call to self.daemonize(), which now forks, is moved to run before self.tracing(), as now that it actually disconnects from the terminal, and thus the prevailing process, the trace loses the processes created in self.run(). Signed-off-by: Ewan Mellor --- tools/python/xen/xend/server/SrvDaemon.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/tools/python/xen/xend/server/SrvDaemon.py b/tools/python/xen/xend/server/SrvDaemon.py index 499da92f22..ff0a4ca9be 100644 --- a/tools/python/xen/xend/server/SrvDaemon.py +++ b/tools/python/xen/xend/server/SrvDaemon.py @@ -123,9 +123,18 @@ class Daemon: def daemonize(self): if not XEND_DAEMONIZE: return + # Detach from TTY. + + # Become the group leader (already a child process) os.setsid() + # Fork, this allows the group leader to exit, + # which means the child can never again regain control of the + # terminal + if self.fork_pid(XEND_PID_FILE): + self.exit() + # Detach from standard file descriptors, and redirect them to # /dev/null or the log as appropriate. os.close(0) @@ -164,7 +173,7 @@ class Daemon: # we can avoid a race condition during startup r,w = os.pipe() - if self.fork_pid(XEND_PID_FILE): + if os.fork(): os.close(w) r = os.fdopen(r, 'r') try: @@ -178,6 +187,7 @@ class Daemon: else: os.close(r) # Child + self.daemonize() self.tracing(trace) self.run(os.fdopen(w, 'w')) @@ -274,7 +284,6 @@ class Daemon: relocate.listenRelocation() servers = SrvServer.create() - self.daemonize() servers.start(status) except Exception, ex: print >>sys.stderr, 'Exception starting xend:', ex -- 2.30.2